home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / FT / win.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  11KB  |  485 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                            */
  3. /*                    F l y i n g   T o a s t e r s                            */
  4. /*                                                                            */
  5. /*                                                                            */
  6. /*                                                                            */
  7. /*--------------------------------------------------------------------------*/
  8. /*    WIN.c                                                                    */
  9. /*--------------------------------------------------------------------------*/
  10.  
  11. #define    WIN_C
  12.  
  13. #if ! defined(HEADER_PROCOMPILED)
  14. # include    "include.h"
  15. #endif
  16. #include    "ft.h"
  17. #include    "win.h"
  18.  
  19.  
  20.  
  21.  
  22. /*--------------------------------------------------------------------------
  23.                                 G L O B A L S 
  24.   --------------------------------------------------------------------------*/
  25. UCHAR    *delay_txt[] = { "Turbo","Medium","Boring" };
  26. struct    Screen    *scr;
  27. struct    Window    *win,
  28.                 *popup_win;
  29. struct    Gadget    *glist;
  30. struct    VisualInfo    *vi;
  31. LOCAL    struct    Gadget    *fm_gad;
  32.  
  33.  
  34. /*--------------------------------------------------------------------------*/
  35. /*    show_delayrate                                                            */
  36. /*--------------------------------------------------------------------------*/
  37. LOCAL LONG __saveds __stdargs show_delayrate(struct Gadget *gad,WORD level)
  38.     {
  39.  
  40.     delay_rate = (ULONG) level;
  41.     return((LONG) delay_txt[level - 1]);
  42.  
  43.     }    /* show_delayrate */
  44.  
  45.  
  46. /*--------------------------------------------------------------------------*/
  47. /*    show_timeout                                                            */
  48. /*--------------------------------------------------------------------------*/
  49. LOCAL LONG __saveds __stdargs show_timeout(struct Gadget *gad,WORD level)
  50.     {
  51.     static    UCHAR    buf[15];
  52.  
  53.  
  54.     sprintf(buf,"%2u:%02u",level / 60, level % 60);
  55.     timeout_ticks = (level * TICKSPERMIN) / 60;
  56.         
  57.     return((LONG) buf);
  58.  
  59.     }    /* show_timeout */
  60.  
  61.  
  62. /*--------------------------------------------------------------------------*/
  63. /*    show_nr_objects                                                            */
  64. /*--------------------------------------------------------------------------*/
  65. LOCAL LONG __saveds __stdargs show_nr_objects(struct Gadget *gad,WORD level)
  66.     {
  67.     static    UCHAR    buf[15];
  68.  
  69.  
  70.     if (level == 0)
  71.         strcpy(buf,"no objects");
  72.     else
  73.         sprintf(buf,"%2u Objects",level);
  74.  
  75.     nr_objects = level;
  76.         
  77.     return((LONG) buf);
  78.  
  79.     }    /* show_nr_objects */
  80.  
  81.  
  82.  
  83. /*--------------------------------------------------------------------------*/
  84. /*    open_popupwin                                                            */
  85. /*--------------------------------------------------------------------------*/
  86. BOOLEAN open_popupwin(void)
  87.     {
  88.     UINT    i;
  89.     struct    Gadget    *gad;
  90.  
  91.  
  92.     if ((prefs_menu = CreateMenus(prefs_nmenu,
  93.             GTNM_Border,(Tag) TRUE, 
  94.             GTMN_TextAttr,(Tag) &ta_courier,
  95.             TAG_END)) == NULL) {
  96.         return(FALSE);
  97.         }
  98.  
  99.     if ((popup_win = OpenWindowTagList(NULL,popup_win_tag)) == NULL)
  100.         return(FALSE);
  101.  
  102.     if ((vi = GetVisualInfo(popup_win->WScreen,TAG_END)) == NULL)
  103.         return(FALSE);
  104.  
  105.     if (LayoutMenusA(prefs_menu,vi,NULL) == 0)
  106.         return(FALSE);
  107.  
  108.     for (i = 0; i < GADGETMAX; i++)
  109.         ng[i].ng_VisualInfo = vi;
  110.  
  111.     ng[GAD_OBJECTS].ng_TopEdge = popup_win->BorderTop + GAP + 
  112.             ng[GAD_OBJECTS].ng_Height;
  113.     ng[GAD_OBJECTS].ng_LeftEdge = popup_win->BorderLeft + 2 * GAP;
  114.  
  115.     ng[GAD_TIMEOUT].ng_TopEdge = ng[GAD_OBJECTS].ng_TopEdge + 
  116.             2 * ng[GAD_OBJECTS].ng_Height + 2 * GAP;
  117.     ng[GAD_TIMEOUT].ng_LeftEdge = ng[GAD_OBJECTS].ng_LeftEdge;
  118.  
  119.     ng[GAD_DELAYRATE].ng_TopEdge = ng[GAD_TIMEOUT].ng_TopEdge + 
  120.             2 * ng[GAD_TIMEOUT].ng_Height + 2 * GAP;
  121.     ng[GAD_DELAYRATE].ng_LeftEdge = ng[GAD_TIMEOUT].ng_LeftEdge;
  122.  
  123.     ng[GAD_SLEEP].ng_TopEdge = ng[GAD_DELAYRATE].ng_TopEdge + 
  124.             2 * ng[GAD_DELAYRATE].ng_Height + 2 * GAP;
  125.     ng[GAD_SLEEP].ng_LeftEdge = ng[GAD_DELAYRATE].ng_LeftEdge;
  126.  
  127.     ng[GAD_NEVER].ng_TopEdge = ng[GAD_SLEEP].ng_TopEdge;
  128.     ng[GAD_NEVER].ng_LeftEdge = ng[GAD_SLEEP].ng_LeftEdge +
  129.             ng[GAD_SLEEP].ng_Width + GAP;
  130.  
  131.     glist = NULL;
  132.     if ((gad = CreateContext(&glist)) == NULL)
  133.         return(FALSE);
  134.  
  135.     gad = CreateGadget(SLIDER_KIND,gad,&ng[GAD_OBJECTS],
  136.             GTSL_Max,            OBJECTMAX,
  137.             GTSL_Min,            0,
  138.             GTSL_DispFunc,        show_nr_objects,
  139.             GTSL_Level,            nr_objects,
  140.             GTSL_LevelFormat,    "%s",
  141.             GTSL_LevelPlace,    PLACETEXT_RIGHT,
  142.             GTSL_MaxLevelLen,    15,
  143.             PGA_Freedom,        LORIENT_HORIZ,
  144.             TAG_END);
  145.     if (gad == NULL)
  146.         return(FALSE);
  147.  
  148.     gad = CreateGadget(SLIDER_KIND,gad,&ng[GAD_TIMEOUT],
  149.             GTSL_Max,            30 * 60,
  150.             GTSL_Min,            5,
  151.             GTSL_DispFunc,        show_timeout,
  152.             GTSL_Level,            (timeout_ticks * 60) / TICKSPERMIN,
  153.             GTSL_LevelFormat,    "%s",
  154.             GTSL_LevelPlace,    PLACETEXT_RIGHT,
  155.             GTSL_MaxLevelLen,    15,
  156.             PGA_Freedom,        LORIENT_HORIZ,
  157.             TAG_END);
  158.     if (gad == NULL)
  159.         return(FALSE);
  160.  
  161.     gad = CreateGadget(SLIDER_KIND,gad,&ng[GAD_DELAYRATE],
  162.             GTSL_Max,            3,
  163.             GTSL_Min,            1,
  164.             GTSL_DispFunc,        show_delayrate,
  165.             GTSL_Level,            delay_rate,
  166.             GTSL_LevelFormat,    "%-8s",
  167.             GTSL_LevelPlace,    PLACETEXT_RIGHT,
  168.             GTSL_MaxLevelLen,    8,
  169.             PGA_Freedom,        LORIENT_HORIZ,
  170.             TAG_END);
  171.     if (gad == NULL)
  172.         return(FALSE);
  173.  
  174.     gad = CreateGadget(BUTTON_KIND,gad,&ng[GAD_HIDE],TAG_END);
  175.     gad->Flags |= GFLG_RELBOTTOM;
  176.     gad->LeftEdge += popup_win->BorderLeft;
  177.     if (gad == NULL)
  178.         return(FALSE);
  179.  
  180.     gad = CreateGadget(BUTTON_KIND,gad,&ng[GAD_QUIT],TAG_END);
  181.     gad->Flags |= GFLG_RELBOTTOM;
  182.     gad->LeftEdge += popup_win->BorderLeft;
  183.     if (gad == NULL)
  184.         return(FALSE);
  185.  
  186.     gad = CreateGadget(BUTTON_KIND,gad,&ng[GAD_BLANK],TAG_END);
  187.     gad->Flags |= GFLG_RELBOTTOM;
  188.     gad->LeftEdge += popup_win->BorderLeft;
  189.     if (gad == NULL)
  190.         return(FALSE);
  191.  
  192.     ng[GAD_FLIGHT_MODE].ng_LeftEdge = BEVEL_X;
  193.     ng[GAD_FLIGHT_MODE].ng_TopEdge = BEVEL_Y + BEVEL_DY + GAP;
  194.     gad = fm_gad = CreateGadget(MX_KIND,gad,&ng[GAD_FLIGHT_MODE],
  195.             GTMX_Labels,    flight_mode_txt,
  196.             GTMX_Spacing,    2,
  197.             TAG_END);
  198.     if (gad == NULL)
  199.         return(FALSE);
  200.  
  201.     gad = CreateGadget(CYCLE_KIND,gad,&ng[GAD_SLEEP],
  202.             GTCY_Labels,    corner_txt,
  203.             GTCY_Active,    csleep,
  204.             TAG_END);
  205.     if (gad == NULL)
  206.         return(FALSE);
  207.  
  208.     gad = CreateGadget(CYCLE_KIND,gad,&ng[GAD_NEVER],
  209.             GTCY_Labels,    corner_txt,
  210.             GTCY_Active,    cnever,
  211.             TAG_END);
  212.     if (gad == NULL)
  213.         return(FALSE);
  214.  
  215.     AddGList(popup_win,glist,0,-1,NULL);
  216.  
  217.     DrawBevelBox(popup_win->RPort,BEVEL_X,BEVEL_Y,BEVEL_DX,BEVEL_DY,
  218.             GT_VisualInfo,vi, TAG_END);
  219.  
  220.     RefreshGadgets(glist,popup_win,NULL);
  221.     GT_RefreshWindow(popup_win,NULL);
  222.     SetMenuStrip(popup_win,prefs_menu);
  223.  
  224.     return(TRUE);
  225.  
  226.     }    /* open_popupwin */
  227.  
  228.  
  229.  
  230. /*--------------------------------------------------------------------------*/
  231. /*    close_popupwin                                                            */
  232. /*--------------------------------------------------------------------------*/
  233. void close_popupwin(void)
  234.     {
  235.  
  236.     if (popup_win != NULL) {
  237.         CloseWindow(popup_win);
  238.         popup_win = NULL;
  239.         }
  240.  
  241.     if (prefs_menu != NULL) {
  242.         FreeMenus(prefs_menu);
  243.         prefs_menu = NULL;
  244.         }
  245.  
  246.     if (glist == NULL) {
  247.         FreeGadgets(glist);
  248.         glist  = NULL;
  249.         }
  250.  
  251.     if (vi != NULL)
  252.         FreeVisualInfo(vi);
  253.  
  254.     }    /* close_popupwin */
  255.  
  256.  
  257.  
  258.  
  259. /*--------------------------------------------------------------------------*/
  260. /*    open_display                                                            */
  261. /*--------------------------------------------------------------------------*/
  262. BOOLEAN open_display(void)
  263.     {
  264.  
  265.     if ((scr = OpenScreenTagList(NULL,scr_tags)) == NULL)
  266.         return(FALSE);
  267.  
  268.     win_tags[7].ti_Data = (LONG) scr;
  269.     win_tags[2].ti_Data = (LONG) scr->Width;
  270.     win_tags[3].ti_Data = (LONG) scr->Height;
  271.  
  272.     if ((win = OpenWindowTagList(NULL,win_tags)) == NULL)
  273.         return(FALSE);
  274.  
  275.     ScreenToFront(scr);
  276.  
  277.     SetAPen(win->RPort,0);
  278.  
  279.     WaitTOF();
  280.  
  281.     SetPointer(win,pointer_data,POINTER_HEIGHT,POINTER_WIDTH,1,1);
  282.  
  283.     return(TRUE);
  284.  
  285.     }    /* open_display */
  286.  
  287.  
  288.  
  289. /*--------------------------------------------------------------------------*/
  290. /*    close_display                                                            */
  291. /*--------------------------------------------------------------------------*/
  292. void close_display(void)
  293.     {
  294.  
  295.     if (win != NULL) {
  296.         CloseWindow(win);
  297.         win = NULL;
  298.         }
  299.  
  300.     if (scr != NULL) {
  301.         CloseScreen(scr);
  302.         scr = NULL;
  303.         }
  304.     }    /* close_display */
  305.  
  306.  
  307.  
  308.  
  309. /*--------------------------------------------------------------------------*/
  310. /*    open_prefs                                                                */
  311. /*--------------------------------------------------------------------------*/
  312. struct ft_msg * open_prefs(void)
  313.     {
  314.     BOOLEAN    display_about;
  315.     INT        freq,
  316.             code,
  317.             txt_index,
  318.             class;
  319.     struct    IntuiMessage *imsg;
  320.     struct    Gadget *gad;
  321.     struct    MenuItem *mi;
  322.     struct    ft_msg *ft_msg;
  323.     struct    object    obj;
  324.     struct    sequence *flight_seq;
  325.  
  326.  
  327.     if (! open_popupwin()) {
  328.         close_popupwin();
  329.         return(NULL);
  330.         }
  331.  
  332.     memset(&obj,'\0',sizeof(obj));
  333.     obj.seq = &default_seq;
  334.  
  335.     freq = 0;
  336.     display_about = FALSE;
  337.     flight_seq = NULL;
  338.  
  339.     FOREVER {
  340.  
  341.         Delay(delay_rate);
  342.  
  343.         if ((imsg = GT_GetIMsg(popup_win->UserPort)) != NULL) {
  344.  
  345.             gad = (struct Gadget *) imsg->IAddress;
  346.             class = imsg->Class;
  347.             code = imsg->Code;
  348.  
  349.             GT_ReplyIMsg(imsg);
  350.  
  351.             switch (class) {
  352.                 case IDCMP_CLOSEWINDOW:
  353.                     close_popupwin();
  354.                     return(NULL);
  355.  
  356.                 case IDCMP_GADGETUP:
  357.                     switch (gad->GadgetID) {
  358.  
  359.                         case GAD_SLEEP:
  360.                             csleep = code;
  361.                             if (csleep != CO_DISABLED && cnever == csleep) {
  362.                                 csleep = (code + 1) % (CO_DISABLED + 1);
  363.                                 GT_SetGadgetAttrs(gad,popup_win,NULL,
  364.                                             GTCY_Active, csleep,
  365.                                             TAG_END);
  366.                                 }
  367.                             break;
  368.  
  369.                         case GAD_NEVER:
  370.                             cnever = code;
  371.                             if (cnever != CO_DISABLED && cnever == csleep) {
  372.                                 cnever = (code + 1) % (CO_DISABLED + 1);
  373.                                 GT_SetGadgetAttrs(gad,popup_win,NULL,
  374.                                             GTCY_Active, cnever,
  375.                                             TAG_END);
  376.                                 }
  377.                             break;
  378.  
  379.                         case GAD_HIDE:
  380.                             close_popupwin();
  381.                             return(NULL);
  382.  
  383.                         case GAD_QUIT:
  384.                             Signal(main_task,SIGBREAKF_CTRL_C);
  385.                             close_popupwin();
  386.                             return(NULL);
  387.  
  388.                         case GAD_BLANK:
  389.                             close_popupwin();        // simulate msg
  390.                             return(init_ftmsg(BA_BLANK));
  391.  
  392.                         }    // switch
  393.                     break;
  394.  
  395.                 case IDCMP_GADGETDOWN:
  396.                     switch (gad->GadgetID) {
  397.                         case GAD_FLIGHT_MODE:
  398.                             flight_seq = seq_list[code];
  399.                             break;
  400.  
  401.                         }    // switch
  402.                     break;
  403.  
  404.                 case IDCMP_MENUPICK:
  405.                     while ((mi = ItemAddress(prefs_menu,code)) != NULL) {
  406.                         switch ((UINT) GTMENUITEM_USERDATA(mi)) {
  407.  
  408.                             case MN_BLANK:
  409.                                 close_popupwin();        // simulate msg
  410.                                 return(init_ftmsg(BA_BLANK));
  411.  
  412.                             case MN_HIDE:
  413.                                 close_popupwin();
  414.                                 return(NULL);
  415.  
  416.                             case MN_QUIT:
  417.                                 Signal(main_task,SIGBREAKF_CTRL_C);
  418.                                 close_popupwin();
  419.                                 return(NULL);
  420.  
  421.                             case MN_ABOUT:
  422.                                 freq = txt_index = 0;
  423.                                 display_about = TRUE;
  424.                                 break;
  425.  
  426.                             case MN_FREE_FLIGHT:
  427.                             case MN_DEF_FLIGHT:
  428.                             case MN_LOOP:
  429.                             case MN_FACE2FACE:
  430.                                 code = (UINT) GTMENUITEM_USERDATA(mi) - MN_FREE_FLIGHT;
  431.                                 GT_SetGadgetAttrs(fm_gad,popup_win,NULL,
  432.                                             GTMX_Active,code,
  433.                                             TAG_END);
  434.                                 flight_seq = seq_list[code];
  435.                                 break;
  436.  
  437.                             }    // switch
  438.                         code = mi->NextSelect;
  439.                         }    // while
  440.                     break;
  441.  
  442.                 }    // switch
  443.             }
  444.  
  445.         if ((ft_msg = (struct ft_msg *) GetMsg(ft_port)) != NULL) {
  446.             if (ft_msg->ftm_action != BA_POPUP_PREFS) {
  447.                 close_popupwin();
  448.                 return(ft_msg);
  449.                 }
  450.             free(ft_msg);
  451.             }
  452.  
  453.         if (! display_about) {
  454.             freq++;
  455.             if (freq == 2) {
  456.                 freq = 0;
  457.                 goto_next_img(&obj,flight_seq);
  458.                 DrawImage(popup_win->RPort,obj.seq->img[obj.phase],FT_X,FT_Y);
  459.                 }
  460.             }
  461.         else {
  462.             freq++;
  463.             WaitTOF();
  464.             ScrollRaster(popup_win->RPort,0,2,BEVEL_X + GAP, BEVEL_Y + GAP,
  465.                     BEVEL_X + BEVEL_DX - GAP,
  466.                     BEVEL_Y + BEVEL_DY - GAP);
  467.             if (freq == 6) {
  468.                 freq = 0;
  469.                 if (about_txt[txt_index] != NULL) {
  470.                     itxt.IText = about_txt[txt_index];
  471.                     PrintIText(popup_win->RPort,&itxt,BEVEL_X + GAP,
  472.                             BEVEL_Y + BEVEL_DY - GAP - 11);
  473.  
  474.                     txt_index++;
  475.                     if (about_txt[txt_index] == NULL)
  476.                         freq = - BEVEL_DY;
  477.                     }
  478.                 else
  479.                     display_about = FALSE;
  480.                 }
  481.             }
  482.         }    // forever
  483.     }    /* open_prefs */
  484.  
  485.